package com.hnit;

import dev.langchain4j.community.model.dashscope.QwenEmbeddingModel;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingSearchResult;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;


public class RAG_App2 {
    public static void main(String[] args) {
        //////////阶段一：向量化+向量数据库
        //1.向量模型
        QwenEmbeddingModel qwenEmbeddingModel = QwenEmbeddingModel.builder()
                .apiKey(System.getenv("ALI_API_KEY"))
                .build();
        //2.向量数据库 clickhouse   ，es ， milvue ，pgvector，chromadb，pinecone，weaviate
        InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore();

        //3.利用向量模型进行向量化，然后存储向量到向量数据库。
        TextSegment textSegment = TextSegment.from("""
                预定钻戒:
                -通过我们的网站或APP预定，您可以轻松拥有一个个性化的钻戒，以表达您的情感和想法，
                -预定时需要全款付款，3天内包退换
                -确保个人信息(姓名，身份证号，手机号等)的准确性，因为更正可能会产生额外10元的费用
                """);
        Embedding embedding1 = qwenEmbeddingModel.embed(textSegment).content();
        embeddingStore.add(embedding1,textSegment);

        TextSegment segments2 = TextSegment.from("""
                取消预定:
                -最晚取消时间为发货前24小时前.
                -取消费用:普通钻戒 20元/件，钻石钻戒 30元/件.
                -退款将在7个工作日内处理
                """);
        Embedding embedding2 = qwenEmbeddingModel.embed(segments2).content();
        embeddingStore.add(embedding2,segments2);

        /////////////阶段二:匹配向量
        Embedding queryEmbedding = qwenEmbeddingModel.embed("退订需要手续费么").content();
        //创建请求
        EmbeddingSearchRequest build = EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults(2)
                .minScore(0.7)
                .build();
        //开始搜索
        EmbeddingSearchResult<TextSegment> result = embeddingStore.search(build);
        //输出结果
        result.matches().forEach(embeddingMatch ->{
            System.out.println(embeddingMatch.score() + "\t"+embeddingMatch.embedded().text());
        });
    }
}
